iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Software Development

Laravel專案練習-寶可夢管理系統系列 第 29

Day29:寶可夢專案-Docker練習-在AWS雲端主機使用Docker遇到的問題

  • 分享至 

  • xImage
  •  

在前面其實我有提到我的一個小目標是在雲端上能夠使用,我在本地包好的docker,以下是我實作及遇到的問題:

目標:可以將自己的image上傳到docker hub

  • 首先可以先看看自己有什麼image
    • 首先可以先看看自己有什麼image

      docker images
      REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
      wadedeilee/mylaravelapp   pokemon   62e7b1eda7a9   2 days ago     1.05GB
      sail-8.2/app              latest    62e7b1eda7a9   2 days ago     1.05GB
      mysql                     latest    3503aa5f0751   4 days ago     599MB
      mysql/mysql-server        8.0       423da140c8c0   8 months ago   507MB
      

      註冊docker Hub帳戶

      • 確保您已擁有一個Docker Hub帳戶。如果還沒有,您需要先註冊一個帳戶

      • 在本地機器上,使用命令行工具登入Docker Hub:它會要求您輸入您的Docker Hub用戶名和密碼。

        
        docker login
        
    • 接著將他push到docker hub

      docker push wadedeilee/mylaravelapp:pokemon
      
      docker push [USERNAME]/[REPOSITORY]:[TAG]
      
    • 確認是否在docker hub上面看到鏡像黨

      有看到鏡像黨

      Untitled

    • 目標三:在雲端主機上,可以使用打包好的環境,直接運行專案,讓專案順利運行

      開一個ec2雲端主機,下載git :

      apt-get update
      apt-get install git
      

      從github上clone資料下來,再從docker

      • 下載docker 及 composer

      • 如何將image 拉下來

        docker pull wadedeilee/mylaravelapp:pokemon
        

      出狀況

      我在我的雲端將容器打開, 但出現Exit 1

      sudo docker-compose up -d
      WARNING: The PWD variable is not set. Defaulting to a blank string.
      Recreating pokemonprojectgold_mysql_1 ... done
      Recreating pokemonprojectgold_laravel.test_1 ... done
      sudo docker-compose ps
      Name Command State Ports
      
      pokemonprojectgold_laravel.test_1   start-container         Exit 1
      pokemonprojectgold_mysql_1          /entrypoint.sh mysqld   Exit 1
      

      於是我去看了日誌:

      Attaching to pokemonprojectgold_laravel.test_1
      laravel.test_1  | exec /usr/local/bin/start-container: exec format error
      Attaching to pokemonprojectgold_mysql_1
      mysql_1         | [Entrypoint] MySQL Docker Image 8.0.32-1.2.11-server
      mysql_1         | [Entrypoint] Starting MySQL 8.0.32-1.2.11-server
      mysql_1         | 2023-09-26T14:01:37.135381Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
      
      • 第一個問題:

        laravel.test_1 exec format error。這個可能是由於start container的腳本出現問題

        • 可能原因
          • 後來去查可能是因為處理器架構問題,我本地是**arm64,**雲端虛擬主機我是開ubuntu 他是x86。

          • 所以由於這兩種架構具有完全不同的指令集和二進制接口。當程序或操作系統被編譯成二進制格式時,它是基於特定的硬體架構和其相應的指令集。

          • 也就是我在本地編譯的檔案在x86可能會不能執行。

          • 解決方法:

            • 使用 Buildx:
              • Docker 提供了一個名為 buildx 的插件,它可以建立跨多個平台的映像。使用 buildx,您可以在單一機器上為多個目標架構(例如 arm64x86_64)建構映像。
              • 但這個我沒有去研究

            這裡我查到最直接的方法就是用ubuntu的系統去建,

            但我目前想說不然我先在雲端主機上先用別人的image跑看看,看會不會有什麼問題

            • 第二個問題:

              每次創建完容器,ec2都會跑不太動,而且重新連線也連不上,我還去看了防火牆的設定。

              但在前輩的提示下,可能是因為我開的ec2是免費方案硬體設備可能不是很頂,所以記憶體有可能會不夠。

              後來我嘗試使用了swap看能不能解決問題

              • 使用swap

                • 什麼事swap

                  如果 RAM 空間滿了,Swap 會將不常用的應用移至硬碟,釋放 RAM 空間,讓新的應用可以進到 RAM

                  • swap 分區 vs. Swap 文件
                    • Swap 分區:通常在安裝 Linux 系統時創建的專用硬碟分區。
                    • Swap 文件:與 Swap 分區功能相同,但是它是一個文件,不是一個硬碟分區。
                  • 使用swap文件
                    1. 创建 Swap 文件

                      使用以下命令创建一个大小为 1GB 的 swap 文件:

                      
                      sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
                      
                      
                    2. 设置合适的权限

                      为了确保只有 root 用户可以读写 swap 文件,设置正确的权限:

                      
                      sudo chmod 600 /swapfile
                      
                      
                    3. 格式化为 Swap

                      使用 mkswap 工具来格式化刚刚创建的文件为 swap 文件:

                      
                      sudo mkswap /swapfile
                      
                      
                    4. 激活 Swap 文件

                      使用 swapon 命令来激活 swap 文件:

                      
                      sudo swapon /swapfile
                      
                      

                      如果你想在每次系统启动时都自动启用这个 swap 文件,你需要将其添加到 /etc/fstab 文件中:

                      
                      echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
                      
                      
                    5. 查看 Swap 是否已启用

                      使用 free 命令来查看当前的内存和 swap 使用情况:

                      
                      free -m
                      
                      
                      total        used        free      shared  buff/cache   available
                      Mem:             949         577          69          18         302         193
                      Swap:           1023           0        1023
                      

                後來再開啟容器就沒有延遲問題了。

小結語

關於docker的使用還有太多要學習,我這裡真的都只是新手初探而已,只是記錄一下使用過踩到的坑,讓剛用的新手包括我自己在未來遇到同樣的問題時可以有一點想法,


上一篇
Day28:寶可夢專案-Docker練習-使用docker-compose創建容器
下一篇
Day30:寶可夢專案-未來展望
系列文
Laravel專案練習-寶可夢管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言